package com.zhitong.money.util;


import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Arrays;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

/**
 * @Author: Andy Zhang
 * @Description:
 * @Date: 9:38 2021/2/7
 * @Company:
 */
public class ExeclUtil {

    /**
     * @Author: AndyZhang
     * @Description 导出excel表格,并下载
     * @param response 使用输出流,用于下载文件
     * @param title 表格标题
     * @param head 表头
     * @param data 表数据(实体)
     * @param sheetName 表标签名
     * @param fileName  文件名
     * @param columnwidth 表格宽度
     * @return
     * @Date: 11:51 2021/2/7
     */
//    public static void exportExecl(HttpServletResponse response,
//                                   String title,
//                                   List<String> head,
//                                   List<?> data,
//                                   String sheetName,
//                                   String fileName,
//                                   int columnwidth ) throws Exception{
//        //创建一个工作簿
//        HSSFWorkbook wb=new HSSFWorkbook();
//        //生成一个表格,并设置表格标签
//        HSSFSheet sheet = wb.createSheet(sheetName);
//        //设置列表格宽度
//        sheet.setDefaultColumnWidth(columnwidth);
//        //写入表头数据
//        int rowIndex=0;
//        if(!title.equals("") && title!=null){
//            HSSFRow rowHead=sheet.createRow(0);
//            HSSFCell cell = rowHead.createCell(0);
//            HSSFRichTextString text = new HSSFRichTextString(title);
//            cell.setCellValue(text);
//            // 设置字体
//            CellStyle cellStyle = wb.createCellStyle();
//            HSSFFont redFont = wb.createFont();
//            //设置字体大小
//            redFont.setFontHeightInPoints((short) 18);
//            //字体
//            redFont.setFontName("黑体");
//            //设置居中
//            cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//            cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//            cellStyle.setFont(redFont);
//            cell.setCellStyle(cellStyle);
//            CellRangeAddress region = new CellRangeAddress(0, 1, 0, 14);
//            sheet.addMergedRegion(region);
//            rowIndex = 2;
//        }
//        int cellIndex=0;
//        HSSFRow rowHead = sheet.createRow(rowIndex++);
//        for(String h : head){
//            //创建一个row行，然后自增1
//            //创建一个单元格
//            HSSFCell cell = rowHead.createCell(cellIndex++);
//            //创建一个内容对象
//            HSSFRichTextString text = new HSSFRichTextString(h);
//            //将内容对象的文字内容写入到单元格中
//            cell.setCellValue(text);
//        }
//        for(int j=0;j<data.size();j++){
//            //创建一个row行，然后自增1
//            HSSFRow rowData = sheet.createRow(rowIndex++);
//            //遍历实体类的每一个属性
//            Field[] field = data.get(j).getClass().getDeclaredFields();
//            for(int k=1;k<field.length;k++){
//                HSSFCell cell=rowData.createCell(k-1);
//                //将属性名称第一个字母大写，便于获取get方法。
//                String name = field[k].getName().substring(0,1).toUpperCase()+field[k].getName().substring(1);
//                String type = field[k].getGenericType().toString();
//                if (type.equals("class java.lang.String")) {
//                    Method m = data.get(j).getClass().getMethod("get" + name);
//                    // 调用getter方法获取属性值
//                    String value = (String) m.invoke(data.get(j));
//                    if (value == null) {
//                        m = data.get(j).getClass().getMethod("set"+name,String.class);
//                        m.invoke(data.get(j), "");
//                    }
//                    if (name=="status"){
//                        value=value=="00"?"已签到":"未签到";
//                    }
//                    if (name=="result"){
//                        switch (value){
//                            case "00":
//                                value="迟到";
//                                break;
//                            case "01":
//                                value="正常";
//                                break;
//                            case "02":
//                                value="早退";
//                                break;
//                            case "03":
//                                value="缺席";
//                                break;
//                            default:
//                                value="暂未签到";
//                                break;
//                        }
//                    }
//                    //创建一个内容对象
//                    HSSFRichTextString text = new HSSFRichTextString(value);
//                    //将内容对象的文字内容写入到单元格中
//                    cell.setCellValue(text);
//                }
//                if (type.equals("class java.lang.Integer")) {
//                    Method m = data.get(j).getClass().getMethod("get" + name);
//                    Integer value = (Integer) m.invoke(data.get(j));
//                    if (value == null) {
//                        m = data.get(j).getClass().getMethod("set"+name,Integer.class);
//                        m.invoke(data.get(j), 0);
//                    }
//                    //创建一个内容对象
//                    HSSFRichTextString text = new HSSFRichTextString(String.valueOf(value));
//                    //将内容对象的文字内容写入到单元格中
//                    cell.setCellValue(text);
//                }
//                if (type.equals("class java.lang.Boolean")) {
//                    Method m = data.get(j).getClass().getMethod("get" + name);
//                    Boolean value = (Boolean) m.invoke(data.get(j));
//                    if (value == null) {
//                        m = data.get(j).getClass().getMethod("set"+name,Boolean.class);
//                        m.invoke(data.get(j), false);
//                    }
//                    //创建一个内容对象
//                    HSSFRichTextString text = new HSSFRichTextString(String.valueOf(value));
//                    //将内容对象的文字内容写入到单元格中
//                    cell.setCellValue(text);
//                }
//                if (type.equals("class java.util.Date")) {
//
//                    Method m = data.get(j).getClass().getMethod("get" + name);
//                    Date value = (Date) m.invoke(data.get(j));
//
//                    //创建一个内容对象
//                    HSSFRichTextString text = new HSSFRichTextString(DateUtil.dateToStr(value,DateUtil.FORMAT_DATE_CHECK));
//                    //将内容对象的文字内容写入到单元格中
//                    cell.setCellValue(text);
//                }
//                if (type.equals("class java.time.Instant")) {
//
//                    Method m = data.get(j).getClass().getMethod("get" + name);
//                    Instant value = (Instant) m.invoke(data.get(j));
//
//                    //创建一个内容对象
//                    HSSFRichTextString text = new HSSFRichTextString(DateUtil.dataTimeToStr(value,DateUtil.FORMAT_DATE_Time));
//                    //将内容对象的文字内容写入到单元格中
//                    cell.setCellValue(text);
//                }
//
//            }
//
//        }
//        //准备将Excel的输出流通过response输出到页面下载
//        //设置导出Excel的名称
//        String fileNameURL = URLEncoder.encode(fileName, "UTF-8");
//        response.setCharacterEncoding("UTF-8");
//        //response.setHeader("Content-disposition", "attachment;filename=" + fileName);
//        response.setHeader("Content-disposition", "attachment;filename="+fileNameURL+";");
//        response.setContentType("application/octet-stream");
//        //刷新缓冲
//        response.flushBuffer();
//        OutputStream ouputStream = response.getOutputStream();
//        //workbook将Excel写入到response的输出流中，供页面下载该Excel文件
//        wb.write(ouputStream);
//        ouputStream.flush();
//        ouputStream.close();
//
//    }


    /**
     *@Author: AndyZhang
     *@Description 获得实体类的所有属性名称
     *@param
     *@return
     *@Date: 14:18 2021/2/7
     */
    public static List<String> getHead(Class m) throws Exception{
        Field[] declaredFields = m.getDeclaredFields();
        LinkedList<String> head=new LinkedList<String>();
        if (declaredFields.length!=0 && declaredFields!=null){
            for (Field f:declaredFields){
                if (!f.getName().equals("id")){
                    head.addLast(f.getName());
                }
            }
        }
        return head;
    }
}
